昨天雖然介紹了 flannel 是如何讓容器之間進行通訊的,但是學弟好像沒有很清楚,還是有些地方不太懂,因此這篇主要是在補充一些昨天沒講到的部分(話說好像是我自己多嘴,講太多有的沒的搞得他們有點混亂)。
首先我們先複習一下 Day 03 的內容, Linux 有所謂的 Network Stack ,負責處裡網路相關的東西,從網路介面接收到封包之後會進入 TC ,這邊我們可以看到另外一張架構圖。在這張架構圖中有一個 ingress qdisc 跟一個 egress qdisc ,這兩個 qdisc 就是一個 buffer ,在 TC 中負責接收從網路介面收到的網路封包。需要注意的是每個介面都會有一組 qdisc 負責接收網路介面的網路封包。
接著 TC 會接著將封包傳送到上層的 Netfilter , Netfilter 中有 5 個掛載點,分別為 PreRouting 、 Input 、 Forward 、 Output 及 PostRouting 。 TC 會將封包傳入 PreRouting ,接著若封包目的 IP 為本機 IP 便會傳送給 Input , Input 在傳送給應用程式。若封包目的 IP 不為本機 IP 則會傳送給 Forward ,進行轉發,而應用程式發出網路封包會由 Output 進行接收,再由 Output 傳送給 PostRouting 。而 Forward 接收後同樣會將封包傳送給 PostRouting ,最後由 PostRouting 傳送出去。總而言之, Netfilter 會根據路由表及封包的目的 IP 將封包傳送給 User space 的應用或者轉發至另一個網路介面(注意!這邊很重要。)。
話說今天好像講太多了,那麼今天就到這邊,各位明天見了。